/**
 * 图片数据调试工具
 * 用于检查前端传来的图片数据格式是否正确
 */
const fs = require('fs');
const path = require('path');
const logger = require('./utils/logger');

/**
 * 检查图片数据格式
 * @param {string} base64Data - Base64编码的图片数据
 * @returns {object} - 检查结果
 */
function checkImageData(base64Data) {
  const result = {
    isValid: false,
    type: typeof base64Data,
    length: base64Data ? base64Data.length : 0,
    hasPrefix: false,
    prefixType: null,
    isValidBase64: false
  };
  
  // 检查是否为字符串
  if (typeof base64Data !== 'string') {
    return result;
  }
  
  result.isValid = true;
  
  // 检查是否包含数据URL前缀
  if (base64Data.startsWith('data:')) {
    result.hasPrefix = true;
    const prefixMatch = base64Data.match(/^data:([^;]+);base64,/);
    if (prefixMatch) {
      result.prefixType = prefixMatch[1];
    }
    
    // 如果有前缀，检查实际的base64部分
    const base64Part = base64Data.split(',')[1];
    if (base64Part) {
      // 检查是否是有效的base64字符串（只包含base64合法字符）
      result.isValidBase64 = /^[A-Za-z0-9+/=]+$/.test(base64Part);
    }
  } else {
    // 检查是否是有效的原始base64字符串
    result.isValidBase64 = /^[A-Za-z0-9+/=]+$/.test(base64Data);
  }
  
  return result;
}

/**
 * 提取和保存示例图片数据用于调试
 * 
 * 将请求中的图片数据保存到文件，以便进行检查
 */
function saveDebugImage(base64Data, plantName = 'unknown') {
  try {
    // 确保调试目录存在
    const debugDir = path.join(__dirname, 'debug');
    if (!fs.existsSync(debugDir)) {
      fs.mkdirSync(debugDir, { recursive: true });
    }
    
    // 格式化植物名称作为文件名
    const safeFileName = plantName.replace(/[^a-zA-Z0-9_\-]/g, '_');
    const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
    const filePath = path.join(debugDir, `${safeFileName}_${timestamp}.txt`);
    
    // 保存图片数据的一些基本信息
    const imageInfo = checkImageData(base64Data);
    const summary = JSON.stringify(imageInfo, null, 2);
    
    // 保存调试信息到文件
    fs.writeFileSync(filePath, 
      `图片数据调试信息:\n${summary}\n\n` +
      `图片数据预览(前100个字符):\n${base64Data ? base64Data.substring(0, 100) + '...' : '无数据'}`
    );
    
    logger.info(`已保存调试图片数据信息: ${filePath}`);
    return filePath;
  } catch (err) {
    logger.error('保存调试图片数据失败', err);
    return null;
  }
}

// 添加新的功能：尝试修复图片数据格式
function attemptToFixImageData(base64Data) {
  // 如果不是字符串，无法修复
  if (typeof base64Data !== 'string') {
    return null;
  }
  
  // 如果已经包含前缀，可能是正确的
  if (base64Data.startsWith('data:image/')) {
    return base64Data;
  }
  
  // 尝试识别并清理任何非base64字符
  let cleanedBase64 = base64Data.replace(/[^A-Za-z0-9+/=]/g, '');
  
  // 添加标准前缀
  return `data:image/jpeg;base64,${cleanedBase64}`;
}

module.exports = {
  checkImageData,
  saveDebugImage,
  attemptToFixImageData
};

// 如果直接执行此脚本，显示用法帮助
if (require.main === module) {
  console.log('图片数据调试工具');
  console.log('用法: 在diagnose.js中引入并使用此模块检查图片数据');
  console.log('- checkImageData(base64Data): 检查图片数据格式');
  console.log('- saveDebugImage(base64Data, plantName): 保存图片数据用于调试');
}
